package com.diandian.backend.file.utils;

import com.diandian.base.boot.starter.exception.DefaultException;
import org.apache.commons.io.FilenameUtils;
import org.apache.tika.Tika;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;

public class FileUtil {

    private static final Logger logger = LoggerFactory.getLogger(FileUtil.class);

    private static final Tika tika = new Tika();

    /**
     * 检查文件扩展名是否与文件一致
     * 说明：todo 目前检测xlsx文件时会判定为application/zip，后续需要处理后再使用此方法
     * @param file
     * @return
     */
    public static boolean fileExtensionCheck(MultipartFile file){
        String fileNameExtension = FilenameUtils.getExtension(file.getOriginalFilename());
        if(fileNameExtension == null || fileNameExtension.trim().equals("")){
            return false;
        }
        String mimeType = FileUtil.getMimeType(file);
        if(mimeType == null || mimeType.trim().equals("")){
            return false;
        }
        logger.info("文件显式扩展名：{}，隐式扩展名：{}", fileNameExtension, mimeType);
        return mimeType.toLowerCase().contains(fileNameExtension.toLowerCase());
    }

    /**
     * 通过元数据检测文件格式
     * @param file
     * @return
     */
    public static String getMimeType(MultipartFile file) {

        String result = "unknown";

        if (file == null || file.isEmpty()) {
            return result;
        }

        try{
            result = tika.detect(file.getInputStream());
        }catch (Exception e){
            logger.error("通过元数据检测文件格式异常", e);
        }

        return result;
    }

    /**
     * 获取置顶文件夹下的名称最大的文件夹名称
     * 说明：名称规则从1开始的数字
     * @param directory 指定的文件夹
     * @param singleDirectoryMaxFileCount 单个文件中保存文件的最大数量
     * @return 名称最大的文件夹名称，不存在则返回空
     */
    public static String getMaxNameDirectory(String directory, int singleDirectoryMaxFileCount){
        File pathFile = new File(directory);
        if(!pathFile.isDirectory()){
            logger.info(directory + "不是一个文件夹，停止后续处理");
            throw new DefaultException(directory + "不是一个文件夹");
        }
        if(!pathFile.exists()){
            logger.info(directory + "文件夹不存在，创建文件夹");
            pathFile.mkdirs();
        }

        File[] nextFileList = pathFile.listFiles();
        if(nextFileList == null || nextFileList.length == 0){
            String firstDirectoryName = "1";
            logger.info(directory + "文件夹下为空，创建文件夹第一个文件夹: {}", firstDirectoryName);
            new File(directory + File.separator + firstDirectoryName).mkdirs();
            return firstDirectoryName;
        }

        int maxNameDirectoryValue = 0;
        int maxNameDirectoryFileCount = 0;
        for (File file : nextFileList) {
            if (file.isDirectory()) {
                int nameValue = Integer.parseInt(file.getName());
                if(nameValue > maxNameDirectoryValue){
                    maxNameDirectoryValue = nameValue;
                    maxNameDirectoryFileCount = file.listFiles().length;
                }
            }
        }

        if(maxNameDirectoryFileCount >= singleDirectoryMaxFileCount){
            String nextDirectoryName = String.valueOf(maxNameDirectoryValue + 1);
            logger.info("切换新的文件夹{}中，将要创建文件夹...", nextDirectoryName);
            new File(directory + File.separator + nextDirectoryName).mkdirs();
            return nextDirectoryName;
        }
        return String.valueOf(maxNameDirectoryValue);
    }
}
